/******************************************************************************
** 公司名称：天津柯迪斯科技有限公司
** 版权信息：
** 文件名称： App_Protocol_MOTINOVA_CAN.h
** 模块名称： 天腾CAN协议处理模块
** 版 本 号： V1.0
** 作    者： 蒲磊
**
** 修改记录： 版本     修改人      时间         修改内容
******************************************************************************/
#ifndef __APP_PROTOCOL_MOTINOVA_H_
#define __APP_PROTOCOL_MOTINOVA_H_

/******************************************************************************
* 头文件
******************************************************************************/
#include "bsp.h"
/******************************************************************************
* 宏定义 ('#define')
******************************************************************************/
#define CAN_LOOP_CYCLE              10      /*vPROTOCOL_Loop()函数的循环调用周期，单位：ms*/
#define gxCAN_RxQueue               0x00    /*Can接收FIFO队列ID*/
#define gxCAN_TxQueue               0x01    /*Can发送FIFO队列ID*/
#define gxCAN_RxQueue_Len           (sizeof(can_rx_message_type) * 30)    /*FIFO长度，30个元素长度*/
#define gxCAN_TxQueue_Len           (sizeof(can_tx_message_type) * 30)
/******************************************************************************
* 类型定义 ('typedef')
******************************************************************************/


/*控制器消息结构体*/
typedef struct
{
    uint16_t    Speed;          /*车速，0.1km/h*/
    uint16_t    Rpm;            /*输出转速，rpm*/
    uint16_t    Power;          /*电功率，W*/
    uint16_t    Voltage;        /*母线电压，mV*/
    uint16_t    Current;        /*母线电流，mA*/
    uint8_t     Cadence;        /*踏频，rpm*/
    uint8_t     Torque;         /*踩踏力矩，Nm*/
    uint8_t     TorqueDir;      /*力矩方向，0-正，1-负，2-停止*/
    uint8_t     Pas;            /*挡位*/
    uint8_t     Lamp;           /*大灯状态，0xF0-关，0xF1-开*/
    int8_t      Soc;            /*电量，1%，无效时为0xFF*/
    uint16_t    Range;          /*续航里程，1km，无效为0xFFFF*/
    uint8_t     Power_Avg;      /*平均功耗，0.01Ah/km*/
    uint8_t     Temp_PCB;       /*PCB温度，*/
    uint8_t     Temp_MOTOR;     /*电机绕组温度*/
    uint8_t     Temp_MCU;       /*MCU温度*/
    uint16_t    Trip_WhenStart; /*开机后骑行里程，0.1km*/
    uint16_t    Time_WhenStart; /*开机后骑行时间，1S*/
    uint32_t    ErrorCode;      /*错误代码，每一位代表一个错误。具体见协议*/
    char        Info_Mode[16];  /*电机类型，ASCII码*/
    char        Info_SN[16];    /*电机SN，ASCII码*/
    char        Info_HW[16];    /*电机硬件版本，ASCII码*/
    char        Info_FW[16];    /*电机软件版本，ASCII码*/
    uint32_t    ODO;            /*ODO里程，0.1km*/
    uint32_t    ODO_Time;       /*ODO时间，1min*/
    uint32_t    Trip;           /*Trip里程，0.1km*/
    uint32_t    Trip_Time;      /*Trip时间，1min*/
    uint8_t     Shutdown;       /*关机指令，1-有效*/
    uint8_t     ShutdownOK;     /*关机就绪，1-有效*/
    uint8_t     WheelLength_Base;   /*轮周长基准值，1cm*/
    int8_t      WheelLength_Adjust; /*轮周长调整值，1cm*/
    uint8_t     StartType;          /*启动模式*/
    uint8_t     SpeedLimit;         /*限速，1km/h*/
    uint8_t     AssistType;         /*助力方案，1-2*/
    uint8_t     IdleTime;           /*自动关机时间*/
} strMCUInfo;

/*BMS消息结构体*/
typedef struct
{
    uint16_t    Voltage;        /*电压，mv*/
    int16_t     Current;        /*电流，mA，放电为负，充电为正*/
    uint16_t    ResCap;         /*剩余容量，1mAh*/
    uint16_t    FullCap;        /*充满容量，1mAh*/
    uint8_t     Temp;           /*电芯温度，+40℃*/
    int8_t      Soc;            /*剩余电量，-1-100%,-1表示不支持SOC*/
    uint8_t     State;          /*运行状态，bit0-休眠位，bit1-充电器是否接入*/
    uint8_t     Soh;            /*健康状态，0-100%*/
    uint16_t    CellVoltage[16];/*电芯电压，mv*/
    uint32_t    ErrorCode;      /*故障码，每位代表不同故障，见协议*/
    char        Info_Mode[16];
    char        Info_SN[16];
    char        Info_HW[16];
    char        Info_FW[16];

} strBatteryInfo;

/*仪表消息结构体*/
typedef struct
{
    uint8_t     Pas;                    /*挡位*/
    uint8_t     Lamp;                   /*大灯状态*/
    int8_t      WheelLength_Adjust;     /*轮周长调整值，1cm*/
    uint8_t     StartType;              /*启动模式*/
    uint8_t     AssistType;             /*助力方案，1-2*/
    uint8_t     IdleTime;               /*自动关机时间，1min，0为不关机*/
    uint8_t     Button;                 /*按键状态*/
} strDisplayInfo;

/*定义车辆信息结构体*/
typedef    struct
{
    strBatteryInfo    Battery;
    strMCUInfo		  MCU;
    strDisplayInfo    Display;
    uint8_t			  ErrCode;

} strBikeInfo;

/******************************************************************************
* 全局变量声明
******************************************************************************/

/******************************************************************************
* 函数声明
******************************************************************************/
void vPROTOCOL_Init(void);
void vPROTOCOL_Get_OneFrame(uint8_t *pData,uint16_t Len);
void vPROTOCOL_Loop(void);
void vPROTOCOL_Send_Run_Data(void);
void vPROTOCOL_Send_Config_Data(void);
void vPROTOCOL_Send_Config_Data_OneTime(void);

void vCAN_CanMsgToUserMsg(can_rx_message_type *pCanMessage);

void vPROTOCOL_Set_Button(uint8_t KeyValue);
void vPROTOCOL_Set_Power(uint8_t State);
void vPROTOCOL_Set_ClearTrip(uint8_t State);
void vPROTOCOL_Set_Lamp(uint8_t State);
void vPROTOCOL_Set_Pas(int8_t Pas);
void vPROTOCOL_Set_WheelLength_Adjust(int8_t Adjust);
void vPROTOCOL_Set_PowerOff(void);
void vPROTOCOL_Set_Value_When_ExitSetting(void);
void vPROTOCOL_Set_Value_When_PowerOn(void);

uint16_t    usPROTOCOL_Get_Voltage(void);
uint16_t    usPROTOCOL_Get_Current(void);
uint16_t    usPROTOCOL_Get_Speed(void);
uint8_t     ucPROTOCOL_Get_Errcode(void);
uint32_t    ulPROTOCOL_Get_Trip(void);
uint32_t    ulPROTOCOL_Get_Odo(void);
uint16_t    usPROTOCOL_Get_Range(void);
uint16_t    usPROTOCOL_Get_Motor_Power(void);
uint32_t    usPROTOCOL_Get_Riding_Time(void);
uint16_t    usPROTOCOL_Get_Wheel_Lenght(void);
int8_t      cPROTOCOL_Get_Wheel_Lenght_Adjust(void);
uint16_t    usPROTOCOL_Get_Speed_Limit(void);
int8_t       cPROTOCOL_Get_Soc(void);


uint16_t    usPROTOCOL_Get_BMS_Voltage(void);
int16_t      sPROTOCOL_Get_BMS_Current(void);
uint8_t     ucPROTOCOL_Get_BMS_SOH(void);
int8_t       cPROTOCOL_Get_BMS_SOC(void);
uint16_t    usPROTOCOL_Get_BMS_ResCap(void);
uint16_t    usPROTOCOL_Get_BMS_Cell_Voltage(uint8_t CellNum);


void vPROTOCOL_Send(void);
void vPROTOCOL_ResetCommunicationOverTime(void);



void vPROTOCOL_Factory_Command(can_rx_message_type *pCanRxMsg);

#endif
